import datetime
import os
import shutil
import sys
import tkinter as tk
import zipfile
from tkinter import simpledialog

import requests
import re
# Todo:疑问，在unzip中直接调用remdir会提示资源未释放，在main函数下面调用则没问题？
"""
1.手动输入浏览器的版本号:Selenium 需要匹配到次版本号,也就是 125.0.6422 这个级别。只要驱动程序的次版本号与浏览器的次版本号相匹配,通常就可以正常使用。
比如,如果你有 Chrome 版本 125.0.6422.142，则需要寻找 Chrome 驱动程序版本 125.0.6422 的驱动程序。通常情况下,这个驱动程序也可以与 125.0.6422.xxx 的浏览器版本兼容。

2.创建一个临时目录，存放下载的压缩包，将压缩包解压后，移动到python安装目录，再将临时目录删除

"""
def input1():
    root = tk.Tk()
    root.withdraw()
    user_input = simpledialog.askstring("输入参数", "请输入您想传递给get_chromedriver的参数:")
    root.destroy()
    return user_input
temdir = None

def creat_temdir():
    """创建临时文件夹，用于存放下载的zip"""
    # 设置全局变量
    global temdir
    nowdate =datetime.datetime.now().strftime("%Y%m%d")
    temdirname = 'C:/drivertem' + nowdate # 临时目录
    try:
        os.makedirs(temdirname ,exist_ok=True)
        print(f"创建临时目录成功: {temdirname}")
        temdir = temdirname
    except OSError as e:
        print(f"创建目录时发生错误: {e.strerror}")

def python_path():
    """驱动必须放在python安装的目录中"""
    python_dir = os.path.dirname(sys.executable)
    # print(python_dir)
    return python_dir

def get_chromedriver(versionNumber):
    """
    传入chrome浏览器的版本号,获取这个页面的下载地址
    下载的驱动版本是:windows64位
    下载源:https://googlechromelabs.github.io/chrome-for-testing
    Todo:可以添加另外的浏览器-->edge,火狐等浏览器
    """

    # 设置需要匹配的正则表达式
    dladd = f'https://storage\\.googleapis\\.com/chrome-for-testing-public/{versionNumber}\\.\\d+/win64/chromedriver-win64\\.zip'
    # with open('chrome.html','r',encoding='utf-8') as f:
    #     soup_content = f.read()
    url = 'https://googlechromelabs.github.io/chrome-for-testing/'
    soup_content = requests.get(url).text

    # 在页面搜索是否存在这个链接:参数(需要匹配的正则表达式,在搜索范围)
    match = re.search(dladd, soup_content)
    # 判断是否匹配到这个链接
    if match:
        dwurl = match.group(0)
        print(f"匹配到该版本的driver,下载链接为:{dwurl}")
        # 下载压缩包,使用已经匹配到的dwurl
        # 下载到临时目录creat_temdir()

        print('路径',temdir)
        path = os.path.join(temdir, 'chromedriver-win64.zip') # 临时目录地址，文件名称
        zip = requests.get(dwurl).content # 下载二进制文件
        with open(path, 'wb') as file:
            file.write(zip)
            print('下载zip成功：chromedriver-win64.zip')
            unzip() # 调用解压文件方法
    else:
        print('未匹配到该版本的driver')
        return

def unzip():
    #解压缩文件,并把文件取出来zipfile
    filepath = os.path.join(temdir, 'chromedriver-win64.zip')
    with zipfile.ZipFile(filepath,'r') as zip_ref:
        zip_ref.extractall(temdir)
    print(f'ZIP文件解压完成，解压路径：{temdir}')

    # 将解压的文件移动到python安装目录中
    dri = os.path.join(temdir,'chromedriver-win64','chromedriver.exe')
    driver_path = os.path.join(python_path(),'chromedriver.exe')
    if os.path.exists(driver_path):
        # 文件已存在，删除
        os.remove(driver_path)
        print(r"删除旧版本driver成功")

    if os.path.exists(dri):
        shutil.move(dri, python_path())
        print(f'文件移动成功:从{temdir}-->{python_path()}')
    else:
        print(f"{dri}文件不存在")



def rmdir(bool):
    """删除临时目录"""
    if bool == 'y':
        try:
            shutil.rmtree(temdir)
        except OSError as e:
            print(f'删除临时目录失败: {e}')
        if os.path.exists(temdir):
            print(f'临时目录还存在,删除失败:{temdir}')
        else:
            print(f'删除临时目录成功:{temdir}')
    else:
        print('不执行删除临时目录')
if __name__ == '__main__':
    creat_temdir()
    get_chromedriver(input("请输入版本号(125.0.6422.xxx)最后三位不用输入: "))
    rmdir(input('是否删除临时目录y/n：'))
